package com.ftg.learn.framework.mybatis.mybatisinterface.mapper;

import com.ftg.learn.framework.mybatis.mybatisinterface.entity.StudentEntity;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Map;

/**
 *
 * 表是一个数据表的  mapper对象，对表进行操作的接口类
 * @author lijiaxin
 * @version 1.0
 * @date 2023/9/1 10:17
 */


public interface StudentMapper {

    /**
     * 查询Student表里面的全部数据
     * mybatis ： 解析 哪一个类里面有 @select这个的注解
     *
     * 如果有注解 ，通过代理模式 自动生成一个当前接口的实现类.
     *
     * mybatis 内部类里面帮你通过 解析  xml拿到数据源
     * 帮你通过connection 执行 @select里面的sql语句，并将返回结果
     * 通过 resultsethandle 类的把结果封装成  List<Map<String, Object>>
     */

    @Select("select * from student")
    List<Map<String,Object>> showAll();

    /**
     * 添加方法
     * arguments  参数  0
     * parameter  参数  1
     *
     * 都不用
     * mybatis 参数注解绑定功能
     * @ 可以以写在参数上面
     *
     * @return 1
     */
    @Insert("insert into student(stu_name,stu_sex) values(#{stu_name},#{stu_sex})")
    int addStudent(@Param("stu_name") String stu_name,@Param("stu_sex") String stu_sex);

    @Update("update student set stu_name=#{stu_name} where id=#{id} ")
    int modifyStudent(@Param("stu_name") String stu_name,@Param("id") int id);

    @Delete("delete from student where id=#{id}")
    int outStudent(@Param("id") int id);

//-------------------------------------------
//    分层结构 有哪些常用包，，名称叫  作用是什么 ，存储哪种java类
    //controller  :  控制层 让前台与后台连接包
    //service     :  业务逻辑处理包  调用多个mapper里面的方法
    //mapper      : sql(二个方法)

    //entity      : pojo (实体类包)
    //util        : 工具包
    //common      ： 通用类
    //config      : 配置类 （xml）
    //domain
    //vo
    //bo
    //po

    @Select("select * from student where stu_name=#{stu_name}")
    StudentEntity findOneName(@Param("stu_name") String stu_name);

    @Select("select * from student where id=#{id}")
    StudentEntity findOneId(@Param("id") String id);
    // 有一个没有任何实际意义的对破坏性操作 ()...mysql
    // 内存 right 线程死锁(机乎为零) innoDB   完整事务  acid ) mysql innodb update insert delete (悲观锁)
    // 慢了  mysql压力

    @Select("select * from student ")
    List<StudentEntity> showAllWithEntity();

    @Update("update student set id=#{se.id},stu_name=#{se.stu_name}," +
            " stu_sex=#{se.stu_sex} where id = #{oldid}")
    int updateStudent(@Param("se") StudentEntity se,@Param("oldid") int oldid);

    @Insert("insert into student(stu_name,stu_sex) values(#{se1.stu_name},#{se1.stu_sex})")
    int insertStudent(@Param("se1") StudentEntity se1);

    @Delete("delete from student where id=#{id}")
    int deleteStudent(@Param("id") int id);
}
